#!/bin/bash

# 财务管理系统重启脚本
# 先停止服务，再重新启动

set -e  # 遇到错误立即退出

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 获取脚本所在目录
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

log_info "正在重启财务管理系统..."

# 检查stop.sh和start.sh是否存在
if [ ! -f "$SCRIPT_DIR/stop.sh" ]; then
    log_error "stop.sh 脚本不存在，无法执行重启操作"
    exit 1
fi

if [ ! -f "$SCRIPT_DIR/start.sh" ]; then
    log_error "start.sh 脚本不存在，无法执行重启操作"
    exit 1
fi

# 函数：停止服务
stop_services() {
    log_info "正在停止现有服务..."
    
    # 执行停止脚本
    if bash "$SCRIPT_DIR/stop.sh"; then
        log_success "服务停止完成"
        # 等待几秒钟确保服务完全停止
        sleep 3
    else
        log_warning "停止服务时出现问题，但继续执行重启操作"
        # 强制清理端口
        cleanup_ports
    fi
}

# 函数：清理端口（备用方案）
cleanup_ports() {
    log_info "清理端口占用..."
    
    # 清理8000端口
    BACKEND_PIDS=$(lsof -ti :8000 2>/dev/null || true)
    if [ ! -z "$BACKEND_PIDS" ]; then
        log_warning "发现端口8000仍被占用，正在清理..."
        echo $BACKEND_PIDS | xargs kill -9 2>/dev/null || true
        sleep 2
    fi
    
    # 清理3000端口
    FRONTEND_PIDS=$(lsof -ti :3000 2>/dev/null || true)
    if [ ! -z "$FRONTEND_PIDS" ]; then
        log_warning "发现端口3000仍被占用，正在清理..."
        echo $FRONTEND_PIDS | xargs kill -9 2>/dev/null || true
        sleep 2
    fi
    
    log_success "端口清理完成"
}

# 函数：启动服务
start_services() {
    log_info "正在重新启动服务..."
    
    # 执行启动脚本
    if bash "$SCRIPT_DIR/start.sh"; then
        log_success "服务重启完成"
    else
        log_error "服务重启失败"
        exit 1
    fi
}

# 函数：检查服务状态
check_services() {
    log_info "检查服务状态..."
    
    # 检查后端服务
    if curl -s http://localhost:8000 > /dev/null 2>&1; then
        log_success "后端服务运行正常"
    else
        log_error "后端服务未正常运行"
        return 1
    fi
    
    # 检查前端服务
    if curl -s http://localhost:3000 > /dev/null 2>&1; then
        log_success "前端服务运行正常"
    else
        log_error "前端服务未正常运行"
        return 1
    fi
    
    return 0
}

# 函数：显示重启信息
show_restart_info() {
    echo
    echo "=========================================="
    log_success "财务管理系统重启完成！"
    echo "=========================================="
    echo "前端地址: http://localhost:3000"
    echo "后端地址: http://localhost:8000"
    echo "=========================================="
    
    # 显示进程PID
    if [ -f "$SCRIPT_DIR/.backend.pid" ]; then
        echo "后端进程 PID: $(cat $SCRIPT_DIR/.backend.pid)"
    else
        echo "后端进程 PID: 未找到PID文件"
    fi
    
    if [ -f "$SCRIPT_DIR/.frontend.pid" ]; then
        echo "前端进程 PID: $(cat $SCRIPT_DIR/.frontend.pid)"
    else
        echo "前端进程 PID: 未找到PID文件"
    fi
    
    echo "=========================================="
    echo "日志文件:"
    echo "  后端: $SCRIPT_DIR/backend.log"
    echo "  前端: $SCRIPT_DIR/frontend.log"
    echo "=========================================="
    echo "要停止服务，请运行: ./stop.sh"
    echo "=========================================="
}

# 错误处理
error_handler() {
    log_error "重启过程中发生错误"
    echo
    echo "=========================================="
    echo "重启失败！请检查日志文件："
    echo "  后端日志: $SCRIPT_DIR/backend.log"
    echo "  前端日志: $SCRIPT_DIR/frontend.log"
    echo "=========================================="
    exit 1
}

# 设置错误处理
trap error_handler ERR

# 主执行流程
main() {
    echo "=========================================="
    echo "    财务管理系统重启脚本"
    echo "=========================================="
    echo
    
    # 停止服务
    stop_services
    
    # 清理端口（备用方案）
    cleanup_ports
    
    # 启动服务
    start_services
    
    # 等待服务完全启动
    log_info "等待服务完全启动..."
    sleep 5
    
    # 检查服务状态
    if check_services; then
        show_restart_info
    else
        log_error "服务状态检查失败，请查看日志文件"
        exit 1
    fi
}

# 执行主函数
main